<?php
namespace doujunyu\utility;

class SelfRedisServer{
    //redis锁
    public function Lock($key,$time = 10){
        while (true){
            $this_time = time();
            if(!SelfRedis::setnx($key,($this_time + $time))){
                $s_time = SelfRedis::ttl($key);
                if($s_time > 0) {
                    sleep($s_time);
                }else{
                    sleep(1);
                }
            }else{
                SelfRedis::expire($key,$time);
                break;
            }
        }
    }


    //
    /** redis定时执行方案，执行期间会一直运行，到时间的任务会执行
     * 放入集合中，自定义的时间过后执行拒绝
     *       SelfRedis::zAdd('auto_work',$order_refund['auto_run_time'],json_encode([
     *           'type' => 'auto_order_user_refund_only',
     *           'order_refund_id' => $model_order_refund->id,
     *           'time' => $order_refund['auto_run_time']
     *       ],JSON_UNESCAPED_UNICODE));
     * 
     */
    public function every_minutes_work(){
        set_time_limit(3600);
        ini_set('memory_limit', '1024M'); // 设置最大内存使用为256MB
        $time = time();
        while(true){
            //-----------------------------------------------------------------------------------------------
            $this_time = time();
            if(time() > ($time + 300)){
                break;
            }
            $redis_data = SelfRedis::zRange('auto_work',0,$this_time);
            if(!$redis_data){//如果没有任务则阻止2秒，减轻服务器压力
                sleep(2);
                continue;
            }
            $redis_data_arr = array_shift($redis_data);//弹出第一个数据进行处理
            $item_data = json_decode($redis_data_arr,true);//转成数组形式
            if($this_time < $item_data['time']){//如果还没有到时间则等待2秒后再次查看
                sleep(2);
                continue;
            }
            // +---------------------------------
            // + 启动事务后进行逻辑处理
            // +---------------------------------

            
            SelfRedis::zRem('auto_work',$redis_data_arr);
            //--------------------------------------------
            sleep(1);//可有可无，每次执行停顿1秒
        }
        return date('Y-m-d H:i:s',$time).'成功'; 
    }


}